package org.easyexcel.Utools;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.springframework.beans.factory.annotation.Autowired;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


// JDBC工具类
public class JDBCDruidUtils {
    private static final Logger logger = LoggerFactory.getLogger(JDBCDruidUtils.class);

    // 返回数据源对象
    // 定义数据源对象
    private static DataSource dataSource;

    @Autowired
    public void setDataSource(DataSource dataSource) {
        JDBCDruidUtils.dataSource = dataSource;
    }

    /*
     * 静态代码块，用于初始化数据源
     */
    static {
        Properties pro = new Properties(); // 创建Properties对象
        // 加载数据库连接池配置文件
        try {
            // 从类路径中加载配置文件
            pro.load(JDBCDruidUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            // 使用DruidDataSourceFactory创建数据源对象
            dataSource = DruidDataSourceFactory.createDataSource(pro);
            logger.info("Data source initialized successfully.");
        } catch (Exception e) {
            // 捕获并打印异常堆栈信息
            logger.error("Failed to initialize data source: ", e);
            throw new ExceptionInInitializerError(e);
        }
    }

    /*
     * 获取数据库连接的方法
     */
    public static Connection getConnection() throws SQLException {
        // 返回数据源的连接
        return dataSource.getConnection();
    }

    /**
     * 关闭Connection和Statement对象资源
     *
     * @param connection 数据库连接对象
     * @param statement  SQL语句执行对象
     * @MethodName: close
     * @return: void
     */
    public static void close(Connection connection, Statement statement) {
        // 判断Connection对象是否为空
        if (connection != null) {
            try {
                // 关闭Connection对象
                connection.close();
            } catch (SQLException e) {
                // 捕获并打印异常堆栈信息
                logger.error("Failed to close connection: ", e);
            }
        }
        // 判断Statement对象是否为空
        if (statement != null) {
            try {
                // 关闭Statement对象
                statement.close();
            } catch (SQLException e) {
                // 捕获并打印异常堆栈信息
                logger.error("Failed to close statement: ", e);
            }
        }
    }

    /**
     * 关闭Connection, Statement和ResultSet三个对象资源
     *
     * @param connection 数据库连接对象
     * @param statement  SQL语句执行对象
     * @param resultSet  查询结果集对象
     * @MethodName: close
     * @return: void
     */
    public static void close(Connection connection, Statement statement, ResultSet resultSet) {
        // 调用关闭Connection和Statement对象的方法
        close(connection, statement);
        // 判断ResultSet对象是否为空
        if (resultSet != null) {
            try {
                // 关闭ResultSet对象
                resultSet.close();
            } catch (SQLException e) {
                // 捕获并打印异常堆栈信息
                logger.error("Failed to close result set: ", e);
            }
        }
    }
}
